﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Windows.Forms;

namespace AvaProvi
{
    [Serializable]
    public class clsEnfoqueMercadoVenta_CRN:clsEnfoqueBase,IControlEstados
    {

        #region Propiedades de clase
        public string NumExterior { get; set; }
        public string NumInterior { get; set; }
        public int Edad { get; set; }
        public double PrecioVenta{ get; set; }
        public double SuperficieConstruccion { get; set; }
        public double PrecioM2
        {
            get
            {
                if (this.SuperficieConstruccion > 0)
                    return this.PrecioVenta / this.SuperficieConstruccion;
                return 0;
            }
        }
        public double AjusteM2Fcus
        {
            get
            {
                double resultado = 0;
                    if((this.SuperficieDeTerreno != 0) && (this.EnfoqueDeMercado.Inmueble.Terreno.Construccion.SuperficieDeTerreno != 0))
                    {
                        resultado = ((this.SuperficieConstruccion / this.SuperficieDeTerreno) / (Convert.ToDouble(this.EnfoqueDeMercado.Inmueble.Terreno.Construccion.SuperficieTotalDeConstruccion) / Convert.ToDouble(this.SuperficieDeTerreno)));
                        return Math.Pow(resultado, 0.16);
                    }
                    return 0;
            }
        }
        public double FactorEdad
        {
            get
            {
                return this.ObtieneFactorEdad();
            }
        }
        public double FactorConservacion { get; set; }
        public double FactorCalidad { get; set; }
        public double VentaM2Homologado
        {
            get
            {
                return this.PrecioM2 * this.FactorDeReferencia;
            }
        }
        #endregion

        #region Constructor
        public clsEnfoqueMercadoVenta_CRN(clsEnfoqueDeMercado_CRN objEnfoque):base(objEnfoque)
        {
            this.NumExterior = string.Empty;
            this.NumInterior = string.Empty;
            this.Edad = 0;
            this.FactorConservacion = 1;
            this.FactorCalidad = 1;
            this.FactorComercializacion = 1;
        }
        #endregion

        #region Métodos

        public bool Guardar()
        {
            if (this.DatosValidos())
            {
                if (this.EsNuevo)
                    return CreaEnfoqueDeVenta();
                else
                {
                    if (this.EsModificado)
                        return ActualizaEnfoqueVenta();
                    else
                        return EliminaEnfoqueVenta();
                }
            }
            return false;
        }

        private bool EliminaEnfoqueVenta()
        {
            clsEnfoqueMercadoVenta_CD objEnfoqueMV_CD = new clsEnfoqueMercadoVenta_CD();
            return objEnfoqueMV_CD.EliminaEnfoqueMVenta(this);
        }

        private bool ActualizaEnfoqueVenta()
        {
            clsEnfoqueMercadoVenta_CD objEnfoqueMV_CD = new clsEnfoqueMercadoVenta_CD();
            return objEnfoqueMV_CD.ActualizaEnfoqueMVenta(this);
        }

        private bool CreaEnfoqueDeVenta()
        {
            clsEnfoqueMercadoVenta_CD objEnfoqueMV_CD = new clsEnfoqueMercadoVenta_CD();
            return objEnfoqueMV_CD.CreaEnfoqueMVenta(this);
        }

        public bool DatosValidos()
        {
            if ((this.FactorOtro != 1) && (this.Justificacion.Length == 0))
            {
                MessageBox.Show("Debe de escribir la Justificación de porqué el Factor Otro es diferente a 0\nLos datos se guardarán hasta que corrija sus datos","Ingresar Justificación de "+this.Etiqueta, MessageBoxButtons.OK,MessageBoxIcon.Information);
                return false;
            }
            return true;
        }

        public override double ObtieneFactorDeReferencia()
        {
            return this.FactorCalidad * this.FactorComercializacion * this.FactorConservacion * this.FactorEdad * this.FactorOtro * this.FactorUbicacion * this.FactorZona * this.AjusteM2Fcus;
        }

        private double ObtieneFactorEdad()
        {
            double Fedad = 1;
            if (this.EnfoqueDeMercado.Inmueble.Terreno.Construccion.TiposDeConstruccion.Count > 0)
            {
                double Vp, Vur, resultado, resultado2;
                clsTipoDeConstruccion_CRN objConstruccion = (clsTipoDeConstruccion_CRN)this.EnfoqueDeMercado.Inmueble.Terreno.Construccion.TiposDeConstruccion[0];
                 Vp = Convert.ToDouble(objConstruccion.VP);
                 Vur = Convert.ToDouble(objConstruccion.VUR);
                 resultado = ((Vur * 0.9) + (Vp * 0.1)) / Vp;
                 resultado2 = (((Vp - this.Edad) * 0.9) + (Vp * 0.1)) / Vp;
                Fedad = resultado / resultado2;
            }
            return Fedad;
        }

        public override double ObtieneFactorSuperficie()
        {
            if (this.EnfoqueDeMercado.Inmueble.Terreno.Construccion.SuperficieTotalDeConstruccion > 0)
            {
                double resultado = this.SuperficieConstruccion / Convert.ToDouble(this.EnfoqueDeMercado.Inmueble.Terreno.Construccion.SuperficieTotalDeConstruccion);
                return Math.Pow(resultado, 1 / 6);
            }
            else
                return 0;
        }

        public static BindingList<clsEnfoqueMercadoVenta_CRN> RecuperaEnfoqueMVentas(clsEnfoqueDeMercado_CRN objEnfoqueDeMercado)
        {
            BindingList<clsEnfoqueMercadoVenta_CRN> blEnfoquesMVentas = new BindingList<clsEnfoqueMercadoVenta_CRN>();
            clsEnfoqueMercadoVenta_CD objEnfoqueMV_CD = new clsEnfoqueMercadoVenta_CD();
            BindingList<dsEnfoqueDeMercado.EnfoqueMercadoVentaRow> blEnfoquesRecuperados = objEnfoqueMV_CD.RecuperaEnfoquesMVentas(objEnfoqueDeMercado.Inmueble.Avaluo.IdAvaluo);
            foreach (dsEnfoqueDeMercado.EnfoqueMercadoVentaRow filaEnfoque in blEnfoquesRecuperados)
            {
                clsEnfoqueMercadoVenta_CRN objEnfoqueVenta = new clsEnfoqueMercadoVenta_CRN(objEnfoqueDeMercado);
                objEnfoqueVenta.CalidadDeZona = filaEnfoque.CalidadZona;
                objEnfoqueVenta.Calle = filaEnfoque.Calle;
                objEnfoqueVenta.Colonia = filaEnfoque.Colonia;
                objEnfoqueVenta.CP = filaEnfoque.CP;
                objEnfoqueVenta.Edad = filaEnfoque.Edad;
                objEnfoqueVenta.EsModificado = true;
                objEnfoqueVenta.Etiqueta = filaEnfoque.Etiqueta;
                objEnfoqueVenta.FactorCalidad = filaEnfoque.FactorCalidad;
                objEnfoqueVenta.FactorComercializacion = filaEnfoque.FactorComercializacion;
                objEnfoqueVenta.FactorConservacion = filaEnfoque.FactorConservacion;
                objEnfoqueVenta.FactorOtro = filaEnfoque.FactorOtro;
                objEnfoqueVenta.FactorUbicacion = filaEnfoque.FactorUbicacion;
                objEnfoqueVenta.FactorZona = filaEnfoque.FactorZona;
                objEnfoqueVenta.FechaDeInvestigacion = filaEnfoque.FechaInvest;
                objEnfoqueVenta.Fuente = filaEnfoque.Fuente;
                objEnfoqueVenta.IDEnfoque = filaEnfoque.IDEnfoque;
                objEnfoqueVenta.Informes = filaEnfoque.Informes;
                objEnfoqueVenta.Justificacion = filaEnfoque.JustificaFOt;
                objEnfoqueVenta.NumExterior = filaEnfoque.NoExt;
                objEnfoqueVenta.NumInterior = filaEnfoque.NoInt;
                objEnfoqueVenta.PrecioVenta = filaEnfoque.PrecioVenta;
                objEnfoqueVenta.SuperficieConstruccion = filaEnfoque.SupConstruccion;
                objEnfoqueVenta.SuperficieDeTerreno = filaEnfoque.SupTerreno;
                objEnfoqueVenta.Telefono = filaEnfoque.Telefono;
                objEnfoqueVenta.TipoInmueble = filaEnfoque.TipoInmueble;
                objEnfoqueVenta.UsoSuelo = filaEnfoque.UsoSuelo;
                blEnfoquesMVentas.Add(objEnfoqueVenta);
            }
            return blEnfoquesMVentas;
        }

        public override void Pegar(object objEnfoque)
        {
            if ((objEnfoque is clsEnfoqueMercadoVenta_CRN) && (objEnfoque != null))
            {
                base.Pegar(objEnfoque);
                clsEnfoqueMercadoVenta_CRN objEnfoqueVenta = (clsEnfoqueMercadoVenta_CRN)(objEnfoque);
                this.NumExterior  = objEnfoqueVenta.NumExterior;
                this.NumInterior = objEnfoqueVenta.NumInterior;
                this.Edad = objEnfoqueVenta.Edad;
                this.PrecioVenta = objEnfoqueVenta.PrecioVenta;
                this.SuperficieConstruccion = objEnfoqueVenta.SuperficieConstruccion;
                this.FactorCalidad = objEnfoqueVenta.FactorCalidad;
                this.FactorConservacion = objEnfoqueVenta.FactorConservacion;
            }
            else
            {
                MessageBox.Show("Aun no ha copiado ningún comparativo de Ventas", "Error al copiar", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        #endregion
    }
}
